/******************************************************************************/
/* Имя файла: mathCalculations.cpp                                            */
/* Дата: 13-03-2024                                                           */
/* Разработчик: Андрей Подлегаев                                              */
/* Группа: 315                                                                */
/* Факультет: ЦДО ТУСУР                                                       */
/* Авторское право: Андрею Подлегаеву                                         */
/* Описание: Консольный калькулятор                                           */
/******************************************************************************/

#include "mathCalculations.h"

/* Реализация функции математических операций
 * @param xStackNumber - ссылка на стек со значениями чисел
 * @param xStackOperation - ссылка на стек со значениями операций
 * @param xItem - ссылка на структуру
 */
bool mathCalculations(std::stack<Lexeme>& xStackNumber, std::stack<Lexeme>& xStackOperation, Lexeme& xItem)
{
  double a, b;
  a = xStackNumber.top().value;
  xStackNumber.pop();

  switch (xStackOperation.top().type) {
    case '+': {
        b = xStackNumber.top().value;
        xStackNumber.pop();

        xItem.type = '0';
        xItem.value = a + b;
        xStackNumber.push(xItem);
        xStackOperation.pop();

        break;
      }
    case '-': {
        b = xStackNumber.top().value;
        xStackNumber.pop();

        xItem.type = '0';
        xItem.value = b - a;
        xStackNumber.push(xItem);
        xStackOperation.pop();

        break;
      }
    case '*': {
        b = xStackNumber.top().value;
        xStackNumber.pop();

        xItem.type = '0';
        xItem.value = a * b;
        xStackNumber.push(xItem);
        xStackOperation.pop();

        break;
      }
    case '/': {
        b = xStackNumber.top().value;
        if(a == 0) {
            std::cout << "Деление на ноль запрещено!\n";
            return false;
          }
        else {
            xStackNumber.pop();

            xItem.type = '0';
            xItem.value = b / a;
            xStackNumber.push(xItem);
            xStackOperation.pop();

            break;
          }
      }
    default: {
        std::cout << "Операции не существует!\n";
        return false;

        break;
      }
    }
  return true;
}

/* Реализация функции определения приоритета операции
 * @param xStackNumber - операция
 */
int getPriority(const char xCh)
{
  if (xCh == '+' || xCh == '-') return 1;
  if (xCh == '*' || xCh == '/') return 2;
  else return 0;
}
